Single cell seq after sorting for PhenoID

sample1 = Neurons1 sample2 = Neurons2 sample3 = Glia1 - Astrocytes (CD44+) sample4 = Glia2 - Radial Glia (CD44-)

In HPC I have run steps of scrnabox (custom pipeline in progress) 1. Cell Ranger for feature seq 2. Create Seurat Objects 3. Apply minimum filtering and calculate percent mitochondria.

I have technical 3 replicates with hashtag labels at this point I haven’t yet demultiplex the hashtags. The data here will be treated as one sample. I sorted three separate samples and pooled them together.

# set up the environment
Warning message:
R graphics engine version 15 is not supported by this version of RStudio. The Plots tab will be disabled until a newer version of RStudio is installed. 
library(Seurat)
Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     
Attaching SeuratObject
Attaching sp
library(dplyr)

Attaching package: ‘dplyr’

The following objects are masked from ‘package:stats’:

    filter, lag

The following objects are masked from ‘package:base’:

    intersect, setdiff, setequal, union
library(Matrix)
library(ggplot2)

rm(list = ls())

Read in the seurat objects made in compute canada

Glia2 <- readRDS(paste(pathway,"seu4.rds",sep = ""))

Neurons1
An object of class Seurat 
33541 features across 3952 samples within 2 assays 
Active assay: RNA (33538 features, 0 variable features)
 1 other assay present: HTO
Neurons2
An object of class Seurat 
33541 features across 34830 samples within 2 assays 
Active assay: RNA (33538 features, 0 variable features)
 1 other assay present: HTO
Glia1
An object of class Seurat 
33541 features across 54723 samples within 2 assays 
Active assay: RNA (33538 features, 0 variable features)
 1 other assay present: HTO
Glia2
An object of class Seurat 
33541 features across 10338 samples within 2 assays 
Active assay: RNA (33538 features, 0 variable features)
 1 other assay present: HTO

Have a look at the objects that already have some filtering

See the violin plots


VlnPlot(Neurons1, pt.size = 0.10, features = c("nFeature_RNA", "nCount_RNA", "percent.mt"), ncol = 3)


VlnPlot(Neurons1, pt.size = 0.10, features = c("nFeature_RNA"), y.max = 500)
Warning: Removed 873 rows containing non-finite values (stat_ydensity).
Warning: Removed 873 rows containing missing values (geom_point).

VlnPlot(Neurons1, pt.size = 0.10, features = c("nCount_RNA"), y.max = 2000)
Warning: Removed 546 rows containing non-finite values (stat_ydensity).
Warning: Removed 546 rows containing missing values (geom_point).

# filter more cells

Neuron1.ft <- subset(Neurons1, subset = nFeature_RNA > 250 & nCount_RNA > 250 & nCount_RNA < 10000) 
Neuron1.ft
An object of class Seurat 
33541 features across 1833 samples within 2 assays 
Active assay: RNA (33538 features, 0 variable features)
 1 other assay present: HTO

Neurons 2 - CD56++


VlnPlot(Neurons2, pt.size = 0.10, features = c("nFeature_RNA", "nCount_RNA", "percent.mt"), ncol = 3)

VlnPlot(Neurons2, pt.size = 0.10, features = c("nFeature_RNA"), y.max = 500)
Warning: Removed 5653 rows containing non-finite values (stat_ydensity).
Warning: Removed 5653 rows containing missing values (geom_point).

VlnPlot(Neurons2, pt.size = 0.10, features = c("nFeature_RNA"), y.max = 1000)
Warning: Removed 2379 rows containing non-finite values (stat_ydensity).
Warning: Removed 2379 rows containing missing values (geom_point).

VlnPlot(Neurons2, pt.size = 0.10, features = c("nCount_RNA"), y.max = 2000)
Warning: Removed 2264 rows containing non-finite values (stat_ydensity).
Warning: Removed 2264 rows containing missing values (geom_point).

# filter more cells

Neuron2.ft <- subset(Neurons2, subset = nFeature_RNA > 500 & nCount_RNA > 500 & nCount_RNA < 10000) 
Neuron2.ft
An object of class Seurat 
33541 features across 5190 samples within 2 assays 
Active assay: RNA (33538 features, 0 variable features)
 1 other assay present: HTO

Glia1 - Astrocyte data

Glia1
An object of class Seurat 
33541 features across 54723 samples within 2 assays 
Active assay: RNA (33538 features, 0 variable features)
 1 other assay present: HTO

Glia2 - Radial Glia


## Filter Glia 2
VlnPlot(Glia2, pt.size = 0.10, features = c("nFeature_RNA", "nCount_RNA", "percent.mt"), ncol = 3)


VlnPlot(Glia2, pt.size = 0.10, features = c("nFeature_RNA"), y.max = 5000)
Warning: Removed 61 rows containing non-finite values (stat_ydensity).
Warning: Removed 61 rows containing missing values (geom_point).

VlnPlot(Glia2, pt.size = 0.10, features = c("nFeature_RNA"), y.max = 1000)
Warning: Removed 2435 rows containing non-finite values (stat_ydensity).
Warning: Removed 2435 rows containing missing values (geom_point).

VlnPlot(Glia2, pt.size = 0.10, features = c("nCount_RNA"), y.max = 1000)
Warning: Removed 3194 rows containing non-finite values (stat_ydensity).
Warning: Removed 3194 rows containing missing values (geom_point).

VlnPlot(Glia2, pt.size = 0.10, features = c("nCount_RNA"), y.max = 12000)
Warning: Removed 199 rows containing non-finite values (stat_ydensity).
Warning: Removed 199 rows containing missing values (geom_point).

# extreme filter

Glia2.ft <- subset(Glia1, subset = nFeature_RNA > 500 & nCount_RNA > 500 & nCount_RNA < 10000) 
Glia2.ft
An object of class Seurat 
33541 features across 37813 samples within 2 assays 
Active assay: RNA (33538 features, 0 variable features)
 1 other assay present: HTO
VlnPlot(Glia1.ft, pt.size = 0.10, features = c("nFeature_RNA", "nCount_RNA", "percent.mt"), ncol = 3)

NA
NA
NA
NA

Analyze each dataset - get clusters

plot3 <- ElbowPlot(seu,ndims = 50)
plot3

plot2
Warning: Transformation introduced infinite values in continuous x-axis
Warning: Removed 13701 rows containing missing values (geom_point).

plot


# umap

seu <- RunUMAP(seu, reduction = "pca", n.neighbors = 43, dims = 1:25)
Warning: The default method for RunUMAP has changed from calling Python UMAP via reticulate to the R-native UWOT using the cosine metric
To use Python UMAP via reticulate, set umap.method to 'umap-learn' and metric to 'correlation'
This message will be shown once per session
21:40:56 UMAP embedding parameters a = 0.9922 b = 1.112
21:40:56 Read 1833 rows and found 25 numeric columns
21:40:56 Using Annoy for neighbor search, n_neighbors = 43
21:40:56 Building Annoy index with metric = cosine, n_trees = 50
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
21:40:56 Writing NN index file to temp file /var/folders/k4/khtkczkd5tn732ftjpwgtr240000gn/T//RtmpgWVi60/file1138f299a329a
21:40:56 Searching Annoy index using 1 thread, search_k = 4300
21:40:56 Annoy recall = 100%
21:40:56 Commencing smooth kNN distance calibration using 1 thread with target n_neighbors = 43
21:40:57 Initializing from normalized Laplacian + noise (using irlba)
21:40:57 Commencing optimization for 500 epochs, with 107418 positive edges
Using method 'umap'
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
21:41:00 Optimization finished
DimPlot(seu, reduction = "umap", group.by = "orig.ident")

NA
NA
NA

Make the clusters Neurons1

Find the cluster markers for Neurons1

Idents(seu) <- 'RNA_snn_res.0.2'
ClusterMarkers <- FindAllMarkers(seu)
Calculating cluster 0

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~10s          
  |++                                                | 2 % ~09s          
  |++                                                | 3 % ~09s          
  |+++                                               | 4 % ~09s          
  |+++                                               | 5 % ~09s          
  |++++                                              | 6 % ~09s          
  |++++                                              | 7 % ~09s          
  |+++++                                             | 8 % ~08s          
  |+++++                                             | 9 % ~08s          
  |++++++                                            | 10% ~09s          
  |++++++                                            | 11% ~08s          
  |+++++++                                           | 12% ~08s          
  |+++++++                                           | 13% ~08s          
  |++++++++                                          | 14% ~08s          
  |++++++++                                          | 15% ~08s          
  |+++++++++                                         | 16% ~08s          
  |+++++++++                                         | 17% ~08s          
  |++++++++++                                        | 18% ~08s          
  |++++++++++                                        | 19% ~07s          
  |+++++++++++                                       | 20% ~07s          
  |+++++++++++                                       | 21% ~07s          
  |++++++++++++                                      | 22% ~07s          
  |++++++++++++                                      | 23% ~07s          
  |+++++++++++++                                     | 24% ~07s          
  |+++++++++++++                                     | 26% ~07s          
  |++++++++++++++                                    | 27% ~07s          
  |++++++++++++++                                    | 28% ~07s          
  |+++++++++++++++                                   | 29% ~07s          
  |+++++++++++++++                                   | 30% ~06s          
  |++++++++++++++++                                  | 31% ~06s          
  |++++++++++++++++                                  | 32% ~06s          
  |+++++++++++++++++                                 | 33% ~06s          
  |+++++++++++++++++                                 | 34% ~06s          
  |++++++++++++++++++                                | 35% ~06s          
  |++++++++++++++++++                                | 36% ~06s          
  |+++++++++++++++++++                               | 37% ~06s          
  |+++++++++++++++++++                               | 38% ~06s          
  |++++++++++++++++++++                              | 39% ~06s          
  |++++++++++++++++++++                              | 40% ~05s          
  |+++++++++++++++++++++                             | 41% ~05s          
  |+++++++++++++++++++++                             | 42% ~05s          
  |++++++++++++++++++++++                            | 43% ~05s          
  |++++++++++++++++++++++                            | 44% ~05s          
  |+++++++++++++++++++++++                           | 45% ~05s          
  |+++++++++++++++++++++++                           | 46% ~05s          
  |++++++++++++++++++++++++                          | 47% ~05s          
  |++++++++++++++++++++++++                          | 48% ~05s          
  |+++++++++++++++++++++++++                         | 49% ~05s          
  |+++++++++++++++++++++++++                         | 50% ~05s          
  |++++++++++++++++++++++++++                        | 51% ~04s          
  |+++++++++++++++++++++++++++                       | 52% ~04s          
  |+++++++++++++++++++++++++++                       | 53% ~04s          
  |++++++++++++++++++++++++++++                      | 54% ~04s          
  |++++++++++++++++++++++++++++                      | 55% ~04s          
  |+++++++++++++++++++++++++++++                     | 56% ~04s          
  |+++++++++++++++++++++++++++++                     | 57% ~04s          
  |++++++++++++++++++++++++++++++                    | 58% ~04s          
  |++++++++++++++++++++++++++++++                    | 59% ~04s          
  |+++++++++++++++++++++++++++++++                   | 60% ~04s          
  |+++++++++++++++++++++++++++++++                   | 61% ~04s          
  |++++++++++++++++++++++++++++++++                  | 62% ~03s          
  |++++++++++++++++++++++++++++++++                  | 63% ~03s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~03s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~03s          
  |++++++++++++++++++++++++++++++++++                | 66% ~03s          
  |++++++++++++++++++++++++++++++++++                | 67% ~03s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~03s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~03s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~03s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~03s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~02s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=09s  
Calculating cluster 1

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~08s          
  |++                                                | 2 % ~08s          
  |++                                                | 3 % ~08s          
  |+++                                               | 4 % ~08s          
  |+++                                               | 5 % ~07s          
  |++++                                              | 6 % ~07s          
  |++++                                              | 7 % ~07s          
  |+++++                                             | 8 % ~07s          
  |+++++                                             | 9 % ~07s          
  |++++++                                            | 10% ~07s          
  |++++++                                            | 11% ~07s          
  |+++++++                                           | 12% ~07s          
  |+++++++                                           | 13% ~07s          
  |++++++++                                          | 14% ~07s          
  |++++++++                                          | 15% ~07s          
  |+++++++++                                         | 16% ~06s          
  |+++++++++                                         | 18% ~06s          
  |++++++++++                                        | 19% ~06s          
  |++++++++++                                        | 20% ~06s          
  |+++++++++++                                       | 21% ~06s          
  |+++++++++++                                       | 22% ~06s          
  |++++++++++++                                      | 23% ~06s          
  |++++++++++++                                      | 24% ~06s          
  |+++++++++++++                                     | 25% ~06s          
  |+++++++++++++                                     | 26% ~06s          
  |++++++++++++++                                    | 27% ~06s          
  |++++++++++++++                                    | 28% ~06s          
  |+++++++++++++++                                   | 29% ~05s          
  |+++++++++++++++                                   | 30% ~05s          
  |++++++++++++++++                                  | 31% ~05s          
  |++++++++++++++++                                  | 32% ~05s          
  |+++++++++++++++++                                 | 33% ~05s          
  |++++++++++++++++++                                | 34% ~05s          
  |++++++++++++++++++                                | 35% ~05s          
  |+++++++++++++++++++                               | 36% ~05s          
  |+++++++++++++++++++                               | 37% ~05s          
  |++++++++++++++++++++                              | 38% ~05s          
  |++++++++++++++++++++                              | 39% ~05s          
  |+++++++++++++++++++++                             | 40% ~05s          
  |+++++++++++++++++++++                             | 41% ~05s          
  |++++++++++++++++++++++                            | 42% ~04s          
  |++++++++++++++++++++++                            | 43% ~04s          
  |+++++++++++++++++++++++                           | 44% ~04s          
  |+++++++++++++++++++++++                           | 45% ~04s          
  |++++++++++++++++++++++++                          | 46% ~04s          
  |++++++++++++++++++++++++                          | 47% ~04s          
  |+++++++++++++++++++++++++                         | 48% ~04s          
  |+++++++++++++++++++++++++                         | 49% ~04s          
  |++++++++++++++++++++++++++                        | 51% ~04s          
  |++++++++++++++++++++++++++                        | 52% ~04s          
  |+++++++++++++++++++++++++++                       | 53% ~04s          
  |+++++++++++++++++++++++++++                       | 54% ~04s          
  |++++++++++++++++++++++++++++                      | 55% ~04s          
  |++++++++++++++++++++++++++++                      | 56% ~03s          
  |+++++++++++++++++++++++++++++                     | 57% ~03s          
  |+++++++++++++++++++++++++++++                     | 58% ~03s          
  |++++++++++++++++++++++++++++++                    | 59% ~03s          
  |++++++++++++++++++++++++++++++                    | 60% ~03s          
  |+++++++++++++++++++++++++++++++                   | 61% ~03s          
  |+++++++++++++++++++++++++++++++                   | 62% ~03s          
  |++++++++++++++++++++++++++++++++                  | 63% ~03s          
  |++++++++++++++++++++++++++++++++                  | 64% ~03s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~03s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~03s          
  |++++++++++++++++++++++++++++++++++                | 67% ~03s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~02s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~02s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~02s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~02s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~02s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=08s  
Calculating cluster 2

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~06s          
  |++                                                | 2 % ~06s          
  |++                                                | 3 % ~05s          
  |+++                                               | 4 % ~05s          
  |+++                                               | 5 % ~05s          
  |++++                                              | 6 % ~05s          
  |++++                                              | 8 % ~05s          
  |+++++                                             | 9 % ~05s          
  |+++++                                             | 10% ~05s          
  |++++++                                            | 11% ~05s          
  |++++++                                            | 12% ~05s          
  |+++++++                                           | 13% ~05s          
  |+++++++                                           | 14% ~05s          
  |++++++++                                          | 15% ~05s          
  |+++++++++                                         | 16% ~05s          
  |+++++++++                                         | 17% ~04s          
  |++++++++++                                        | 18% ~04s          
  |++++++++++                                        | 19% ~04s          
  |+++++++++++                                       | 20% ~04s          
  |+++++++++++                                       | 22% ~04s          
  |++++++++++++                                      | 23% ~04s          
  |++++++++++++                                      | 24% ~04s          
  |+++++++++++++                                     | 25% ~04s          
  |+++++++++++++                                     | 26% ~04s          
  |++++++++++++++                                    | 27% ~04s          
  |++++++++++++++                                    | 28% ~04s          
  |+++++++++++++++                                   | 29% ~04s          
  |++++++++++++++++                                  | 30% ~04s          
  |++++++++++++++++                                  | 31% ~04s          
  |+++++++++++++++++                                 | 32% ~04s          
  |+++++++++++++++++                                 | 33% ~04s          
  |++++++++++++++++++                                | 34% ~04s          
  |++++++++++++++++++                                | 35% ~04s          
  |+++++++++++++++++++                               | 37% ~03s          
  |+++++++++++++++++++                               | 38% ~03s          
  |++++++++++++++++++++                              | 39% ~03s          
  |++++++++++++++++++++                              | 40% ~03s          
  |+++++++++++++++++++++                             | 41% ~03s          
  |+++++++++++++++++++++                             | 42% ~03s          
  |++++++++++++++++++++++                            | 43% ~03s          
  |+++++++++++++++++++++++                           | 44% ~03s          
  |+++++++++++++++++++++++                           | 45% ~03s          
  |++++++++++++++++++++++++                          | 46% ~03s          
  |++++++++++++++++++++++++                          | 47% ~03s          
  |+++++++++++++++++++++++++                         | 48% ~03s          
  |+++++++++++++++++++++++++                         | 49% ~03s          
  |++++++++++++++++++++++++++                        | 51% ~03s          
  |++++++++++++++++++++++++++                        | 52% ~03s          
  |+++++++++++++++++++++++++++                       | 53% ~03s          
  |+++++++++++++++++++++++++++                       | 54% ~03s          
  |++++++++++++++++++++++++++++                      | 55% ~02s          
  |++++++++++++++++++++++++++++                      | 56% ~02s          
  |+++++++++++++++++++++++++++++                     | 57% ~02s          
  |++++++++++++++++++++++++++++++                    | 58% ~02s          
  |++++++++++++++++++++++++++++++                    | 59% ~02s          
  |+++++++++++++++++++++++++++++++                   | 60% ~02s          
  |+++++++++++++++++++++++++++++++                   | 61% ~02s          
  |++++++++++++++++++++++++++++++++                  | 62% ~02s          
  |++++++++++++++++++++++++++++++++                  | 63% ~02s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~02s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~02s          
  |++++++++++++++++++++++++++++++++++                | 67% ~02s          
  |++++++++++++++++++++++++++++++++++                | 68% ~02s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~02s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~02s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~02s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~02s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=06s  
Calculating cluster 3

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~09s          
  |++                                                | 2 % ~09s          
  |++                                                | 3 % ~09s          
  |+++                                               | 4 % ~09s          
  |+++                                               | 5 % ~09s          
  |++++                                              | 6 % ~09s          
  |++++                                              | 7 % ~08s          
  |+++++                                             | 8 % ~08s          
  |+++++                                             | 9 % ~09s          
  |++++++                                            | 10% ~09s          
  |++++++                                            | 11% ~08s          
  |+++++++                                           | 12% ~08s          
  |+++++++                                           | 13% ~08s          
  |++++++++                                          | 14% ~08s          
  |++++++++                                          | 15% ~08s          
  |+++++++++                                         | 16% ~08s          
  |+++++++++                                         | 18% ~08s          
  |++++++++++                                        | 19% ~07s          
  |++++++++++                                        | 20% ~07s          
  |+++++++++++                                       | 21% ~07s          
  |+++++++++++                                       | 22% ~07s          
  |++++++++++++                                      | 23% ~07s          
  |++++++++++++                                      | 24% ~07s          
  |+++++++++++++                                     | 25% ~07s          
  |+++++++++++++                                     | 26% ~07s          
  |++++++++++++++                                    | 27% ~07s          
  |++++++++++++++                                    | 28% ~06s          
  |+++++++++++++++                                   | 29% ~06s          
  |+++++++++++++++                                   | 30% ~06s          
  |++++++++++++++++                                  | 31% ~06s          
  |++++++++++++++++                                  | 32% ~06s          
  |+++++++++++++++++                                 | 33% ~06s          
  |++++++++++++++++++                                | 34% ~06s          
  |++++++++++++++++++                                | 35% ~06s          
  |+++++++++++++++++++                               | 36% ~06s          
  |+++++++++++++++++++                               | 37% ~06s          
  |++++++++++++++++++++                              | 38% ~06s          
  |++++++++++++++++++++                              | 39% ~05s          
  |+++++++++++++++++++++                             | 40% ~05s          
  |+++++++++++++++++++++                             | 41% ~05s          
  |++++++++++++++++++++++                            | 42% ~05s          
  |++++++++++++++++++++++                            | 43% ~05s          
  |+++++++++++++++++++++++                           | 44% ~05s          
  |+++++++++++++++++++++++                           | 45% ~05s          
  |++++++++++++++++++++++++                          | 46% ~05s          
  |++++++++++++++++++++++++                          | 47% ~05s          
  |+++++++++++++++++++++++++                         | 48% ~05s          
  |+++++++++++++++++++++++++                         | 49% ~04s          
  |++++++++++++++++++++++++++                        | 51% ~04s          
  |++++++++++++++++++++++++++                        | 52% ~04s          
  |+++++++++++++++++++++++++++                       | 53% ~04s          
  |+++++++++++++++++++++++++++                       | 54% ~04s          
  |++++++++++++++++++++++++++++                      | 55% ~04s          
  |++++++++++++++++++++++++++++                      | 56% ~04s          
  |+++++++++++++++++++++++++++++                     | 57% ~04s          
  |+++++++++++++++++++++++++++++                     | 58% ~04s          
  |++++++++++++++++++++++++++++++                    | 59% ~04s          
  |++++++++++++++++++++++++++++++                    | 60% ~04s          
  |+++++++++++++++++++++++++++++++                   | 61% ~03s          
  |+++++++++++++++++++++++++++++++                   | 62% ~03s          
  |++++++++++++++++++++++++++++++++                  | 63% ~03s          
  |++++++++++++++++++++++++++++++++                  | 64% ~03s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~03s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~03s          
  |++++++++++++++++++++++++++++++++++                | 67% ~03s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~03s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~03s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~03s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~03s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~02s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=09s  
top5 <- ClusterMarkers %>% group_by(cluster) %>% top_n(n=5, wt = avg_log2FC)
DoHeatmap(seu, features = top5$gene, size=3, angle =90, group.bar.height = 0.02, group.by = 'RNA_snn_res.0.2')



#write.csv(ClusterMarkers, "/Users/rhalenathomas/Documents/Data/scRNAseq/PhenoID/scRNAseqSorted/ClusterMarkers_neurons1_res025.csv")


write.csv(ClusterMarkers, "/Users/rhalenathomas/Documents/Data/scRNAseq/PhenoID/scRNAseqSorted/ClusterMarkers_neurons1_res02.csv")
DimPlot(seu, group.by = 'RNA_snn_res.0.2', reduction = 'umap')

Annotate clusters Use: Organoid data, public brain data (LaManno, Lake, Mascako)

Merge the files

Idents(Neurons1ft) <- 'orig.ident'
Neurons1ft$orig.ident <- 'Neurons1'
Idents(Neurons2ft) <- 'orig.ident'
Neurons2ft$orig.ident <- 'Neurons2'
Idents(Glia1ft) <- 'orig.ident'
Glia1ft$orig.ident <- 'Glia1'
Idents(Glia2ft) <- 'orig.ident'
Glia2ft$orig.ident <- 'Glia2'


sorted.merge <- merge(Neurons1ft, y=c(Neurons2ft,Glia1ft,Glia2ft), add.cell.ids = c("Neurons1","Neurons2","Glia1","Glia2"), project = "SortedCells")
sorted.merge
An object of class Seurat 
33544 features across 138206 samples within 2 assays 
Active assay: RNA (33538 features, 0 variable features)
 1 other assay present: HTO
table(all.ft$orig.ident)

   Glia1    Glia2 Neurons1 Neurons2 
   55268    10429     3418    29575 

Prepare for the clustering


all.ft <- ScaleData(all.ft)
Centering and scaling data matrix

  |                                                                                                   
  |                                                                                             |   0%
  |                                                                                                   
  |==============================================                                               |  50%
  |                                                                                                   
  |=============================================================================================| 100%
all.ft <- RunPCA(all.ft)
PC_ 1 
Positive:  STMN2, CD24, CHGB, CELF4, GRIA2, CACNA2D1, EOMES, INSM1, PCAT4, NEUROD1 
       MARCH1, GAP43, RASGRP1, MIAT, STMN4, PCSK2, IMPG2, CHGA, INA, MGAT4C 
       CDHR1, NRN1, GNG8, ST18, IGFBPL1, DDC, LHX1, SLC17A6, NEUROG1, PKIB 
Negative:  VIM, COL3A1, LGALS1, IGFBP7, DCN, APOE, COL1A1, SPARC, IGFBP4, MDK 
       TIMP1, GSTP1, HSP90B1, S100A11, COL1A2, IGFBP5, TMSB10, GAPDH, S100A6, SPATS2L 
       RPL7A, CALD1, ZFP36L1, IGFBP2, RPL10, FTL, SPARCL1, FABP5, S100A10, IFITM3 
PC_ 2 
Positive:  COL3A1, DCN, COL1A1, IGFBP7, COL1A2, APOE, VIM, HPD, IGFBP4, CP 
       FABP5, FTL, S100A11, S100A6, VCAN, NDUFA4L2, LGALS1, WFIKKN2, COL6A3, MGP 
       TIMP1, IFITM3, LUM, CYP1B1, RPS12, CRYAB, ID3, CXCL14, WIF1, APOC1 
Negative:  CELF4, CACNA2D1, INA, STMN2, CHGB, PCDH9, ANK3, MARCH1, EOMES, GRIA2 
       SOX4, DCX, SSTR2, STMN1, NEUROD1, TENM3, INSM1, ATCAY, OLFM1, STMN4 
       CRMP1, SYT1, GAP43, ATP1A3, NCKAP5, AMER2, PCLO, ELAVL3, CA10, NRXN1 
PC_ 3 
Positive:  COL3A1, COL1A2, COL1A1, VCAN, COL6A3, S100A4, LUM, DCN, COL4A1, COL4A2 
       OGN, EDNRA, COL6A1, COL5A2, APOD, PRRX1, COL6A2, IGFBP4, FN1, MFAP4 
       NDUFA4L2, THY1, TNFAIP6, PCOLCE, COL15A1, COL5A1, IFI16, PLAC9, CD248, BGN 
Negative:  PTPRZ1, WLS, SOX2, GABBR2, CNTNAP2, SPARCL1, LY6H, CLU, GDF10, CRYAB 
       SERPINI1, S100B, WNT2B, ESM1, SLC2A1, ITM2C, LIX1, TPBG, RFX4, CBLN1 
       RSPO2, MEGF10, NELL2, MGST1, SCG2, HPD, VAT1L, ABCA8, PLTP, SLC1A3 
PC_ 4 
Positive:  WFIKKN2, CP, ECEL1, SERPINF1, KRT18, ID1, PCP4, CYP1B1, RBP1, IGFBP7 
       TPBG, KRT8, FHIT, WIF1, CA2, TMSB4X, BMP4, HPD, FOLR1, CRABP2 
       SPINT2, EFEMP1, CXCL14, KCNJ13, ASCL1, GPNMB, MDK, EMX2, SLC4A10, RPS12 
Negative:  PTN, PTPRZ1, GABBR2, MEGF10, DLK1, SCG2, ATP1A2, FN1, SGCD, SOX2 
       ABCA8, NTRK2, RFX4, ESM1, COL4A1, MARCKS, COL4A2, VCAN, VAT1L, GRIN2A 
       NRIP3, SCRG1, HAP1, OGN, SORCS2, EDNRB, SFRP2, PLP1, LUM, FFAR4 
PC_ 5 
Positive:  TPBG, FN1, OGN, DKK3, IFI16, MSX1, CXCL14, OLFML2A, CA2, PAPPA2 
       NID1, SYNE2, ENPP2, SLC4A10, CDC42EP3, KCNJ13, IGF1, GPHN, IGFBP2, ZEB2 
       EXPH5, NOV, TRPM3, HTR2C, GPNMB, MPZ, CYP1B1, CADM2, SLC5A3, PIK3R1 
Negative:  APOE, APOC1, DCN, FABP5, DLK1, PTN, KDR, PRSS56, CLU, IGFBP4 
       BST2, TFPI2, S100A6, PTGDS, CITED4, COL23A1, RPL10, FTL, SLC7A2, IFITM3 
       FABP4, NDUFA4L2, GNG11, RARRES1, FXYD5, SCG2, WFDC1, TMEM176B, RPL7A, TMEM176A 
plot <- VizDimLoadings(all.ft, dims = 1:2, reduction = "pca")
#SaveFigure(plot, "viz_PCA_loadings", width = 10, height = 8)
plot

NA
NA
plot <- DimPlot(all.ft, reduction = "pca", group.by = "orig.ident")

plot


plot <- ElbowPlot(all.ft,ndims = 50)
plot


# best is the 
VlnPlot(all.ft, features = c("NCAM1","CD44","CD24","AQP4","TH"), ncol = 3, group.by = 'orig.ident')

The expression of the selected markers are not very revealing - there are neuronal markers in the Glia

I wish I had done an unsorted sample

Now I have all 4 samples I want to try the integration steps

Warning message:
R graphics engine version 15 is not supported by this version of RStudio. The Plots tab will be disabled until a newer version of RStudio is installed. 
all.ft <- readRDS("/Users/rhalenathomas/Documents/Data/scRNAseq/PhenoID/scRNAseqSorted/cellrangerOuts/AllcellsObjectSept20filtered.Rds")
Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     
Registered S3 method overwritten by 'htmlwidgets':
  method           from         
  print.htmlwidget tools:rstudio
all.int <- IntegrateData(anchorset = all.anchors)
Merging dataset 1 into 2
Extracting anchors for merged samples
Finding integration vectors
Finding integration vector weights
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Integrating data
Merging dataset 4 into 3
Extracting anchors for merged samples
Finding integration vectors
Finding integration vector weights
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Integrating data
Merging dataset 2 1 into 3 4
Extracting anchors for merged samples
Finding integration vectors
Finding integration vector weights
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Integrating data

Now that I have the integrated object I will continue to follow the standard scRNAseq to workflow and identify cell types.

Cluster


all.int <- FindNeighbors(all.int, dims = 1:30, k.param = 275)
Computing nearest neighbor graph
Computing SNN

Try on the not integrated object - just merge

all.ft <- RunUMAP(all.ft, reduction = "pca", n.neighbors = 30, dims = 1:21)
16:34:29 UMAP embedding parameters a = 0.9922 b = 1.112
16:34:29 Read 92644 rows and found 21 numeric columns
16:34:29 Using Annoy for neighbor search, n_neighbors = 30
16:34:29 Building Annoy index with metric = cosine, n_trees = 50
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
16:34:35 Writing NN index file to temp file /var/folders/k4/khtkczkd5tn732ftjpwgtr240000gn/T//RtmpxdKhUe/file114bc936cbd
16:34:35 Searching Annoy index using 1 thread, search_k = 3000
16:35:03 Annoy recall = 100%
16:35:04 Commencing smooth kNN distance calibration using 1 thread with target n_neighbors = 30
16:35:08 Initializing from normalized Laplacian + noise (using irlba)
16:35:16 Commencing optimization for 200 epochs, with 4273678 positive edges
Using method 'umap'
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
16:36:16 Optimization finished
DimPlot(all.ft, reduction = "umap", group.by = "orig.ident")

Find the clusters

all.ft <- FindClusters(all.ft, resolution = 0.3)
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 92644
Number of edges: 2838478

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.8755
Number of communities: 9
Elapsed time: 34 seconds
#clustree(all.int, prefix = "RNA_snn_res.")
DimPlot(all.ft, reduction = "umap")

Transfer labels from other Midbrain organoid data (165 days)

# this is the reference data
MBO <- readRDS("/Users/rhalenathomas/Documents/Data/scRNAseq/AST23_BrainComm/MBOclusters_names29072021.rds")

Idents(MBO) <- "cluster_labels"

DefaultAssay(all.ft) <- "RNA"

DefaultAssay(MBO) <- "RNA"

MO.query <- all.ft
# find the reference anchors
print("finding reference anchors")
[1] "finding reference anchors"
MO.anchors <- FindTransferAnchors(reference = MBO ,query = MO.query, dims = 1:30)
Performing PCA on the provided reference using 2000 features as input.
Projecting cell embeddings
Finding neighborhoods
Finding anchors
    Found 1965 anchors
Filtering anchors
    Retained 588 anchors
# can try a range of dims 20-50
print("getting predictions")
[1] "getting predictions"
predictions <- TransferData(anchorset = MO.anchors, refdata = MBO$cluster_labels)
Finding integration vectors
Finding integration vector weights
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Predicting cell labels
MO.query <- AddMetaData(MO.query, metadata = predictions)


print(table(MO.query$predicted.id))

       Epithelial Neural Precursors        Neurons-DA         Neurons-e  Oligodendrocytes 
             1152               396               943             13239             59074 
              RGa              RGd1              RGd2 
               14             17776                50 

See the predictions


DimPlot(MO.query, reduction = "umap", group.by = 'predicted.id')

NA
NA

Some heatmaps

See the usual marker lists - by sorted population, by clusters

Markers.glia1Vs2 <- FindMarkers(all.ft, ident.1 = c('Glia1'), ident.2 = c('Glia2'))

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~01m 12s      
  |+                                                 | 2 % ~01m 12s      
  |++                                                | 3 % ~01m 11s      
  |++                                                | 4 % ~01m 10s      
  |+++                                               | 5 % ~01m 09s      
  |+++                                               | 6 % ~01m 08s      
  |++++                                              | 7 % ~01m 08s      
  |++++                                              | 8 % ~01m 07s      
  |+++++                                             | 9 % ~01m 07s      
  |+++++                                             | 10% ~01m 06s      
  |++++++                                            | 11% ~01m 04s      
  |++++++                                            | 12% ~01m 03s      
  |+++++++                                           | 13% ~01m 02s      
  |+++++++                                           | 14% ~01m 01s      
  |++++++++                                          | 15% ~59s          
  |++++++++                                          | 16% ~59s          
  |+++++++++                                         | 17% ~58s          
  |+++++++++                                         | 18% ~57s          
  |++++++++++                                        | 19% ~56s          
  |++++++++++                                        | 20% ~55s          
  |+++++++++++                                       | 21% ~54s          
  |+++++++++++                                       | 22% ~53s          
  |++++++++++++                                      | 23% ~53s          
  |++++++++++++                                      | 24% ~52s          
  |+++++++++++++                                     | 25% ~51s          
  |+++++++++++++                                     | 26% ~51s          
  |++++++++++++++                                    | 27% ~50s          
  |++++++++++++++                                    | 28% ~49s          
  |+++++++++++++++                                   | 29% ~49s          
  |+++++++++++++++                                   | 30% ~48s          
  |++++++++++++++++                                  | 31% ~47s          
  |++++++++++++++++                                  | 32% ~47s          
  |+++++++++++++++++                                 | 33% ~46s          
  |+++++++++++++++++                                 | 34% ~45s          
  |++++++++++++++++++                                | 35% ~45s          
  |++++++++++++++++++                                | 36% ~44s          
  |+++++++++++++++++++                               | 37% ~43s          
  |+++++++++++++++++++                               | 38% ~42s          
  |++++++++++++++++++++                              | 39% ~42s          
  |++++++++++++++++++++                              | 40% ~41s          
  |+++++++++++++++++++++                             | 41% ~41s          
  |+++++++++++++++++++++                             | 42% ~40s          
  |++++++++++++++++++++++                            | 43% ~39s          
  |++++++++++++++++++++++                            | 44% ~38s          
  |+++++++++++++++++++++++                           | 45% ~38s          
  |+++++++++++++++++++++++                           | 46% ~37s          
  |++++++++++++++++++++++++                          | 47% ~36s          
  |++++++++++++++++++++++++                          | 48% ~36s          
  |+++++++++++++++++++++++++                         | 49% ~35s          
  |+++++++++++++++++++++++++                         | 50% ~34s          
  |++++++++++++++++++++++++++                        | 51% ~34s          
  |++++++++++++++++++++++++++                        | 52% ~33s          
  |+++++++++++++++++++++++++++                       | 53% ~32s          
  |+++++++++++++++++++++++++++                       | 54% ~32s          
  |++++++++++++++++++++++++++++                      | 55% ~31s          
  |++++++++++++++++++++++++++++                      | 56% ~30s          
  |+++++++++++++++++++++++++++++                     | 57% ~30s          
  |+++++++++++++++++++++++++++++                     | 58% ~29s          
  |++++++++++++++++++++++++++++++                    | 59% ~28s          
  |++++++++++++++++++++++++++++++                    | 60% ~28s          
  |+++++++++++++++++++++++++++++++                   | 61% ~27s          
  |+++++++++++++++++++++++++++++++                   | 62% ~26s          
  |++++++++++++++++++++++++++++++++                  | 63% ~26s          
  |++++++++++++++++++++++++++++++++                  | 64% ~25s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~24s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~24s          
  |++++++++++++++++++++++++++++++++++                | 67% ~23s          
  |++++++++++++++++++++++++++++++++++                | 68% ~22s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~21s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~21s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~20s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~19s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~19s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~18s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~17s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~17s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~16s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~15s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~14s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~14s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~13s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~12s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~12s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~11s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~10s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~10s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~09s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~08s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~08s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~07s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~06s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~05s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=01m 09s
# Compare Neurons1 vs Neurons2
Markers.neurons1vs2 <- FindMarkers(all.ft, ident.1 = c('Neurons1'), ident.2 = c('Neurons2'))
For a more efficient implementation of the Wilcoxon Rank Sum Test,
(default method for FindMarkers) please install the limma package
--------------------------------------------
install.packages('BiocManager')
BiocManager::install('limma')
--------------------------------------------
After installation of limma, Seurat will automatically use the more 
efficient implementation (no further action necessary).
This message will be shown once per session

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~17s          
  |++                                                | 3 % ~17s          
  |++                                                | 4 % ~17s          
  |+++                                               | 5 % ~17s          
  |++++                                              | 6 % ~16s          
  |++++                                              | 8 % ~16s          
  |+++++                                             | 9 % ~16s          
  |++++++                                            | 10% ~16s          
  |++++++                                            | 12% ~16s          
  |+++++++                                           | 13% ~16s          
  |++++++++                                          | 14% ~15s          
  |++++++++                                          | 16% ~15s          
  |+++++++++                                         | 17% ~15s          
  |++++++++++                                        | 18% ~15s          
  |++++++++++                                        | 19% ~15s          
  |+++++++++++                                       | 21% ~14s          
  |++++++++++++                                      | 22% ~14s          
  |++++++++++++                                      | 23% ~14s          
  |+++++++++++++                                     | 25% ~14s          
  |+++++++++++++                                     | 26% ~14s          
  |++++++++++++++                                    | 27% ~13s          
  |+++++++++++++++                                   | 29% ~13s          
  |+++++++++++++++                                   | 30% ~13s          
  |++++++++++++++++                                  | 31% ~13s          
  |+++++++++++++++++                                 | 32% ~12s          
  |+++++++++++++++++                                 | 34% ~12s          
  |++++++++++++++++++                                | 35% ~12s          
  |+++++++++++++++++++                               | 36% ~12s          
  |+++++++++++++++++++                               | 38% ~11s          
  |++++++++++++++++++++                              | 39% ~11s          
  |+++++++++++++++++++++                             | 40% ~11s          
  |+++++++++++++++++++++                             | 42% ~11s          
  |++++++++++++++++++++++                            | 43% ~11s          
  |+++++++++++++++++++++++                           | 44% ~10s          
  |+++++++++++++++++++++++                           | 45% ~10s          
  |++++++++++++++++++++++++                          | 47% ~10s          
  |+++++++++++++++++++++++++                         | 48% ~10s          
  |+++++++++++++++++++++++++                         | 49% ~09s          
  |++++++++++++++++++++++++++                        | 51% ~09s          
  |++++++++++++++++++++++++++                        | 52% ~09s          
  |+++++++++++++++++++++++++++                       | 53% ~09s          
  |++++++++++++++++++++++++++++                      | 55% ~08s          
  |++++++++++++++++++++++++++++                      | 56% ~08s          
  |+++++++++++++++++++++++++++++                     | 57% ~08s          
  |++++++++++++++++++++++++++++++                    | 58% ~08s          
  |++++++++++++++++++++++++++++++                    | 60% ~07s          
  |+++++++++++++++++++++++++++++++                   | 61% ~07s          
  |++++++++++++++++++++++++++++++++                  | 62% ~07s          
  |++++++++++++++++++++++++++++++++                  | 64% ~07s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~06s          
  |++++++++++++++++++++++++++++++++++                | 66% ~06s          
  |++++++++++++++++++++++++++++++++++                | 68% ~06s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~06s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~05s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~05s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~05s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~05s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~05s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~04s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~04s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=18s  

Check cell types using EnrichR

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQpTaW5nbGUgY2VsbCBzZXEgYWZ0ZXIgc29ydGluZyBmb3IgUGhlbm9JRAoKc2FtcGxlMSA9IE5ldXJvbnMxCnNhbXBsZTIgPSBOZXVyb25zMgpzYW1wbGUzID0gR2xpYTEgLSBBc3Ryb2N5dGVzIChDRDQ0KykKc2FtcGxlNCA9IEdsaWEyIC0gUmFkaWFsIEdsaWEgKENENDQtKQoKSW4gSFBDIEkgaGF2ZSBydW4gc3RlcHMgb2Ygc2NybmFib3ggKGN1c3RvbSBwaXBlbGluZSBpbiBwcm9ncmVzcykKMS4gQ2VsbCBSYW5nZXIgZm9yIGZlYXR1cmUgc2VxCjIuIENyZWF0ZSBTZXVyYXQgT2JqZWN0cyAKMy4gQXBwbHkgbWluaW11bSBmaWx0ZXJpbmcgYW5kIGNhbGN1bGF0ZSBwZXJjZW50IG1pdG9jaG9uZHJpYS4KCkkgaGF2ZSB0ZWNobmljYWwgMyByZXBsaWNhdGVzIHdpdGggaGFzaHRhZyBsYWJlbHMgYXQgdGhpcyBwb2ludCBJIGhhdmVuJ3QgeWV0IGRlbXVsdGlwbGV4IHRoZSBoYXNodGFncy4gVGhlIGRhdGEgaGVyZSB3aWxsIGJlIHRyZWF0ZWQgYXMgb25lIHNhbXBsZS4gIEkgc29ydGVkIHRocmVlIHNlcGFyYXRlIHNhbXBsZXMgYW5kIHBvb2xlZCB0aGVtIHRvZ2V0aGVyLiAKCgpgYGB7cn0KIyBzZXQgdXAgdGhlIGVudmlyb25tZW50CgpsaWJyYXJ5KFNldXJhdCkKbGlicmFyeShkcGx5cikKbGlicmFyeShNYXRyaXgpCmxpYnJhcnkoZ2dwbG90MikKCnJtKGxpc3QgPSBscygpKQoKCmBgYAoKClJlYWQgaW4gdGhlIHNldXJhdCBvYmplY3RzIG1hZGUgaW4gY29tcHV0ZSBjYW5hZGEKCmBgYHtyfQoKIyB0aGlzIHNlZW1zIHRvIG5ldmVyIGxvYWQgSSdsbCB1c2Ugc3RlcCAzIG91dHB1dCB0aGF0IGhhcyBzb21lIGZpbHRlcmluZyAKIyBuRmVhdHVyZV9STkEgPiAxODAgYW5kIHBlcmNlbnQubXQgPCAyNQoKcGF0aHdheSA8LSAiL1VzZXJzL3JoYWxlbmF0aG9tYXMvRG9jdW1lbnRzL0RhdGEvc2NSTkFzZXEvUGhlbm9JRC9zY1JOQXNlcVNvcnRlZC9vYmpzLyIKCk5ldXJvbnMxIDwtIHJlYWRSRFMocGFzdGUocGF0aHdheSwic2V1MS5yZHMiLHNlcCA9ICIiKSkKTmV1cm9uczIgPC0gcmVhZFJEUyhwYXN0ZShwYXRod2F5LCJzZXUyLnJkcyIsc2VwID0gIiIpKQpHbGlhMSA8LSByZWFkUkRTKHBhc3RlKHBhdGh3YXksInNldTMucmRzIixzZXAgPSAiIikpCkdsaWEyIDwtIHJlYWRSRFMocGFzdGUocGF0aHdheSwic2V1NC5yZHMiLHNlcCA9ICIiKSkKCk5ldXJvbnMxCk5ldXJvbnMyCkdsaWExCkdsaWEyCgpgYGAKCgpIYXZlIGEgbG9vayBhdCB0aGUgb2JqZWN0cyB0aGF0IGFscmVhZHkgaGF2ZSBzb21lIGZpbHRlcmluZwoKClNlZSB0aGUgdmlvbGluIHBsb3RzIAoKYGBge3J9CgpWbG5QbG90KE5ldXJvbnMxLCBwdC5zaXplID0gMC4xMCwgZmVhdHVyZXMgPSBjKCJuRmVhdHVyZV9STkEiLCAibkNvdW50X1JOQSIsICJwZXJjZW50Lm10IiksIG5jb2wgPSAzKQoKVmxuUGxvdChOZXVyb25zMSwgcHQuc2l6ZSA9IDAuMTAsIGZlYXR1cmVzID0gYygibkZlYXR1cmVfUk5BIiksIHkubWF4ID0gNTAwKQpWbG5QbG90KE5ldXJvbnMxLCBwdC5zaXplID0gMC4xMCwgZmVhdHVyZXMgPSBjKCJuQ291bnRfUk5BIiksIHkubWF4ID0gMjAwMCkKCgoKIyBmaWx0ZXIgbW9yZSBjZWxscwoKTmV1cm9uMS5mdCA8LSBzdWJzZXQoTmV1cm9uczEsIHN1YnNldCA9IG5GZWF0dXJlX1JOQSA+IDI1MCAmIG5Db3VudF9STkEgPiAyNTAgJiBuQ291bnRfUk5BIDwgMTAwMDApIApOZXVyb24xLmZ0CgojIDMzNTQxIGZlYXR1cmVzIGFjcm9zcyAxODMzIHNhbXBsZXMKCgpgYGAKCk5ldXJvbnMgMiAtIENENTYrKwoKYGBge3J9CgpWbG5QbG90KE5ldXJvbnMyLCBwdC5zaXplID0gMC4xMCwgZmVhdHVyZXMgPSBjKCJuRmVhdHVyZV9STkEiLCAibkNvdW50X1JOQSIsICJwZXJjZW50Lm10IiksIG5jb2wgPSAzKQpWbG5QbG90KE5ldXJvbnMyLCBwdC5zaXplID0gMC4xMCwgZmVhdHVyZXMgPSBjKCJuRmVhdHVyZV9STkEiKSwgeS5tYXggPSA1MDApClZsblBsb3QoTmV1cm9uczIsIHB0LnNpemUgPSAwLjEwLCBmZWF0dXJlcyA9IGMoIm5GZWF0dXJlX1JOQSIpLCB5Lm1heCA9IDEwMDApClZsblBsb3QoTmV1cm9uczIsIHB0LnNpemUgPSAwLjEwLCBmZWF0dXJlcyA9IGMoIm5Db3VudF9STkEiKSwgeS5tYXggPSAyMDAwKQoKCgojIGZpbHRlciBtb3JlIGNlbGxzCgpOZXVyb24yLmZ0IDwtIHN1YnNldChOZXVyb25zMiwgc3Vic2V0ID0gbkZlYXR1cmVfUk5BID4gNTAwICYgbkNvdW50X1JOQSA+IDUwMCAmIG5Db3VudF9STkEgPCAxMDAwMCkgCk5ldXJvbjIuZnQKCgoKYGBgCgpHbGlhMSAtIEFzdHJvY3l0ZSBkYXRhCgpgYGB7cn0KClZsblBsb3QoR2xpYTEsIHB0LnNpemUgPSAwLjEwLCBmZWF0dXJlcyA9IGMoIm5GZWF0dXJlX1JOQSIsICJuQ291bnRfUk5BIiwgInBlcmNlbnQubXQiKSwgbmNvbCA9IDMpCgpWbG5QbG90KEdsaWExLCBwdC5zaXplID0gMC4xMCwgZmVhdHVyZXMgPSBjKCJuRmVhdHVyZV9STkEiKSwgeS5tYXggPSA1MDAwKQpWbG5QbG90KEdsaWExLCBwdC5zaXplID0gMC4xMCwgZmVhdHVyZXMgPSBjKCJuRmVhdHVyZV9STkEiKSwgeS5tYXggPSAxMDAwKQpWbG5QbG90KEdsaWExLCBwdC5zaXplID0gMC4xMCwgZmVhdHVyZXMgPSBjKCJuQ291bnRfUk5BIiksIHkubWF4ID0gMTAwMCkKVmxuUGxvdChHbGlhMSwgcHQuc2l6ZSA9IDAuMTAsIGZlYXR1cmVzID0gYygibkNvdW50X1JOQSIpLCB5Lm1heCA9IDEyMDAwKQoKCiMgZXh0cmVtZSBmaWx0ZXIKCkdsaWExLmZ0IDwtIHN1YnNldChHbGlhMSwgc3Vic2V0ID0gbkZlYXR1cmVfUk5BID4gNTAwICYgbkNvdW50X1JOQSA+IDMwMCAmIG5Db3VudF9STkEgPCAxMDAwMCkgCkdsaWExLmZ0CkdsaWExCgpWbG5QbG90KEdsaWExLmZ0LCBwdC5zaXplID0gMC4xMCwgZmVhdHVyZXMgPSBjKCJuRmVhdHVyZV9STkEiLCAibkNvdW50X1JOQSIsICJwZXJjZW50Lm10IiksIG5jb2wgPSAzKQoKCgoKCmBgYAoKCkdsaWEyIC0gUmFkaWFsIEdsaWEKCmBgYHtyfQoKIyMgRmlsdGVyIEdsaWEgMgpWbG5QbG90KEdsaWEyLCBwdC5zaXplID0gMC4xMCwgZmVhdHVyZXMgPSBjKCJuRmVhdHVyZV9STkEiLCAibkNvdW50X1JOQSIsICJwZXJjZW50Lm10IiksIG5jb2wgPSAzKQoKVmxuUGxvdChHbGlhMiwgcHQuc2l6ZSA9IDAuMTAsIGZlYXR1cmVzID0gYygibkZlYXR1cmVfUk5BIiksIHkubWF4ID0gNTAwMCkKVmxuUGxvdChHbGlhMiwgcHQuc2l6ZSA9IDAuMTAsIGZlYXR1cmVzID0gYygibkZlYXR1cmVfUk5BIiksIHkubWF4ID0gMTAwMCkKVmxuUGxvdChHbGlhMiwgcHQuc2l6ZSA9IDAuMTAsIGZlYXR1cmVzID0gYygibkNvdW50X1JOQSIpLCB5Lm1heCA9IDEwMDApClZsblBsb3QoR2xpYTIsIHB0LnNpemUgPSAwLjEwLCBmZWF0dXJlcyA9IGMoIm5Db3VudF9STkEiKSwgeS5tYXggPSAxMjAwMCkKCgojIGV4dHJlbWUgZmlsdGVyCgpHbGlhMi5mdCA8LSBzdWJzZXQoR2xpYTEsIHN1YnNldCA9IG5GZWF0dXJlX1JOQSA+IDUwMCAmIG5Db3VudF9STkEgPiA1MDAgJiBuQ291bnRfUk5BIDwgMTAwMDApIApHbGlhMi5mdAoKClZsblBsb3QoR2xpYTEuZnQsIHB0LnNpemUgPSAwLjEwLCBmZWF0dXJlcyA9IGMoIm5GZWF0dXJlX1JOQSIsICJuQ291bnRfUk5BIiwgInBlcmNlbnQubXQiKSwgbmNvbCA9IDMpCgojIHRoZXJlIGFyZSBzbyBtYW55IHN1cG9zZWQgY2VsbHMgSSBhbSBjb25jZXJuZWQgdGhlIGhpZ2ggcmVhZCBjZWxscyBhcmUgYWN0dWFsbHkgZG91YmxldHMuIAoKCgpgYGAKCgpBbmFseXplIGVhY2ggZGF0YXNldCAtIGdldCBjbHVzdGVycyAKCmBgYHtyfQoKIyBjbHVzdGVyIHRoZSBuZXVyb25zCnNldSA8LSBOZXVyb24xLmZ0CnNldSRvcmlnLmlkZW50IDwtICdOZXVyb25zMScKCnNldSA8LSBOb3JtYWxpemVEYXRhKHNldSwgbm9ybWFsaXphdGlvbi5tZXRob2QgPSAiTG9nTm9ybWFsaXplIiwgc2NhbGUuZmFjdG9yID0gMTAwMDApCnNldSA8LSBGaW5kVmFyaWFibGVGZWF0dXJlcyhzZXUsIHNlbGVjdGlvbi5tZXRob2QgPSAidnN0IiwgbmZlYXR1cmVzID0gMjAwMCkKIyBJZGVudGlmeSB0aGUgMTAgbW9zdCBoaWdobHkgdmFyaWFibGUgZ2VuZXMKdG9wMTAgPC0gaGVhZChWYXJpYWJsZUZlYXR1cmVzKHNldSksIDEwKQojIHBsb3QgdmFyaWFibGUgZmVhdHVyZXMgd2l0aCBhbmQgd2l0aG91dCBsYWJlbHMKcGxvdDEgPC0gVmFyaWFibGVGZWF0dXJlUGxvdChzZXUpCnBsb3QyIDwtIExhYmVsUG9pbnRzKHBsb3QgPSBwbG90MSwgcG9pbnRzID0gdG9wMTAsIHJlcGVsID0gVFJVRSkKCgoKc2V1IDwtIFNjYWxlRGF0YShzZXUpCnNldSA8LSBSdW5QQ0Eoc2V1KQpJZGVudHMoc2V1KSA8LSAnb3JpZy5pZGVudCcKcGxvdCA8LSBEaW1QbG90KHNldSwgcmVkdWN0aW9uID0gInBjYSIpCgoKcGxvdDMgPC0gRWxib3dQbG90KHNldSxuZGltcyA9IDUwKQpwbG90MwoKcGxvdDIKcGxvdAoKCgpgYGAKCmBgYHtyfQoKIyB1bWFwCgpzZXUgPC0gUnVuVU1BUChzZXUsIHJlZHVjdGlvbiA9ICJwY2EiLCBuLm5laWdoYm9ycyA9IDQzLCBkaW1zID0gMToyNSkKRGltUGxvdChzZXUsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgZ3JvdXAuYnkgPSAib3JpZy5pZGVudCIpCgoKCmBgYAoKTWFrZSB0aGUgY2x1c3RlcnMgTmV1cm9uczEKCmBgYHtyfQoKc2V1IDwtIEZpbmROZWlnaGJvcnMoc2V1LCBkaW1zID0gMToyNSwgay5wYXJhbSA9IDQzKQpzZXUgPC0gRmluZENsdXN0ZXJzKHNldSwgcmVzb2x1dGlvbiA9IGMoMCwwLjIsMC4yNSwwLjUsMC44KSkKc2V1IDwtIEZpbmRDbHVzdGVycyhzZXUsIHJlc29sdXRpb24gPSBjKDEuMikpCgpsaWJyYXJ5KGNsdXN0cmVlKQpjbHVzdHJlZShzZXUsIHByZWZpeCA9ICJSTkFfc25uX3Jlcy4iKQpEaW1QbG90KHNldSkKCmBgYAoKYGBge3J9CiMgbG9vayBhIGxvdCBhdCB0aGUgY2x1c2VycwoKVmxuUGxvdChzZXUsIGZlYXR1cmVzID0gYygibkZlYXR1cmVfUk5BIiwgIm5Db3VudF9STkEiLCAicGVyY2VudC5tdCIpLCBncm91cC5ieSA9ICdzZXVyYXRfY2x1c3RlcnMnLCBuY29sID0gMSkKIyB0aGVzZSBjZWxscyBtaWdodCBiZSBncm91cGluZyBieSAtIGhvdyBtdWNoIE1UIGFuZCBudW1iZXIgb2YgRmVhdHVyZXMKIyBjbHVzdGVycyA0LDUsNiBoYXZlIG1vcmUgZmVhdHVyZXMKClZsblBsb3Qoc2V1LCBmZWF0dXJlcyA9IGMoIm5GZWF0dXJlX1JOQSIsICJuQ291bnRfUk5BIiwgInBlcmNlbnQubXQiKSwgZ3JvdXAuYnkgPSAnUk5BX3Nubl9yZXMuMC4yNScsIG5jb2wgPSAxKQojIGhlcmUgY2x1c3RlciAzIGhhcyBoaWdoZXIgZXhwcmVzc2lvbiwgY2x1c3RlciAxIGFuZCA0IGhhdmUgc2ltaWxhciBGZWF0dXJlcyBSTkEKIyBjbHVzdGVyIDAgaGFzIGhpZ2hlciBwZXJjZW50IE1UIGxldmVscwoKVmxuUGxvdChzZXUsIGZlYXR1cmVzID0gYygibkZlYXR1cmVfUk5BIiwgIm5Db3VudF9STkEiLCAicGVyY2VudC5tdCIpLCBncm91cC5ieSA9ICdSTkFfc25uX3Jlcy4wLjUnLCBuY29sID0gMSkKVmxuUGxvdChzZXUsIGZlYXR1cmVzID0gYygibkZlYXR1cmVfUk5BIiwgIm5Db3VudF9STkEiLCAicGVyY2VudC5tdCIpLCBncm91cC5ieSA9ICdSTkFfc25uX3Jlcy4wLjInLCBuY29sID0gMSkKIyBub3cgb25seSBjbHVzdGVyIDAgaGF2ZSBoaWdoIE1UIGFuZCBsb3cgZmVhdHVyZXMsIGNsdXN0ZXJzIDEsMiwzIGhhdmUgc2ltaXVsYXIgUk5BIGFuZCBDb3VudHMKCmBgYAoKRmluZCB0aGUgY2x1c3RlciBtYXJrZXJzIGZvciBOZXVyb25zMQoKYGBge3J9CklkZW50cyhzZXUpIDwtICdSTkFfc25uX3Jlcy4wLjInCkNsdXN0ZXJNYXJrZXJzIDwtIEZpbmRBbGxNYXJrZXJzKHNldSkKCnRvcDUgPC0gQ2x1c3Rlck1hcmtlcnMgJT4lIGdyb3VwX2J5KGNsdXN0ZXIpICU+JSB0b3BfbihuPTUsIHd0ID0gYXZnX2xvZzJGQykKRG9IZWF0bWFwKHNldSwgZmVhdHVyZXMgPSB0b3A1JGdlbmUsIHNpemU9MywgYW5nbGUgPTkwLCBncm91cC5iYXIuaGVpZ2h0ID0gMC4wMiwgZ3JvdXAuYnkgPSAnUk5BX3Nubl9yZXMuMC4yJykKCgojd3JpdGUuY3N2KENsdXN0ZXJNYXJrZXJzLCAiL1VzZXJzL3JoYWxlbmF0aG9tYXMvRG9jdW1lbnRzL0RhdGEvc2NSTkFzZXEvUGhlbm9JRC9zY1JOQXNlcVNvcnRlZC9DbHVzdGVyTWFya2Vyc19uZXVyb25zMV9yZXMwMjUuY3N2IikKCgp3cml0ZS5jc3YoQ2x1c3Rlck1hcmtlcnMsICIvVXNlcnMvcmhhbGVuYXRob21hcy9Eb2N1bWVudHMvRGF0YS9zY1JOQXNlcS9QaGVub0lEL3NjUk5Bc2VxU29ydGVkL0NsdXN0ZXJNYXJrZXJzX25ldXJvbnMxX3JlczAyLmNzdiIpCgpgYGAKCmBgYHtyfQpEaW1QbG90KHNldSwgZ3JvdXAuYnkgPSAnUk5BX3Nubl9yZXMuMC4yJywgcmVkdWN0aW9uID0gJ3VtYXAnKQoKYGBgCgoKCgoKCkFubm90YXRlIGNsdXN0ZXJzClVzZTogT3JnYW5vaWQgZGF0YSwgcHVibGljIGJyYWluIGRhdGEgKExhTWFubm8sIExha2UsIE1hc2Nha28pCgoKYGBge3J9CgojIHRoaXMgaXMgc29tZSByZWZlcmVuY2UgZGF0YQoKIyBTTkNBIGFuZCBjb250cm9sIG1pZGJyYWluIG9yZ2Fub2lkcyAxNjUgZGF5cyBpbiBjdWx0dXJlCk1CTyA8LSByZWFkUkRTKCIvVXNlcnMvcmhhbGVuYXRob21hcy9Eb2N1bWVudHMvRGF0YS9zY1JOQXNlcS9BU1QyM19CcmFpbkNvbW0vTUJPY2x1c3RlcnNfbmFtZXMyOTA3MjAyMS5yZHMiKQoKIyBNaWRicmFpbiAgQUlXMDAyIDEyMCBkYXlzIGluIGN1bHR1cmUKQUlXTUJPIDwtICIvVXNlcnMvcmhhbGVuYXRob21hcy9Eb2N1bWVudHMvRGF0YS9zY1JOQXNlcS9BSVd0cmlvMTIwZGF5cy9NT2ludGVncmF0ZWRDbHVzdGVySzEyM3JlczAuOC5uYW1lc19ub3YxNl8yMDIxIgojIERBIG5ldXJvbiBzdWJ0eXBlcyBmcm9tIHBvc3Rtb3J0ZW0gYnJhaW4gS2FtYXRoIGV0IGFsIDIwMjIKREFzdWJ0eXBlcyA8LSByZWFkUkRTKCIvVXNlcnMvcmhhbGVuYXRob21hcy9Eb2N1bWVudHMvRGF0YS9zY1JOQXNlcS9NYWNvc2tvX0RhdGEvUERfZGEuUmRzIikKCklkZW50cyhNQk8pIDwtICJjbHVzdGVyX2xhYmVscyIKRGVmYXVsdEFzc2F5KE1CTykgPC0gIlJOQSIKCiNmaXJzdCBwcmVkaWN0IHdpdGggdGhlIE1CTyBkYXRhCgpNTy5xdWVyeSA8LXNldQojIGZpbmQgdGhlIHJlZmVyZW5jZSBhbmNob3JzCnByaW50KCJmaW5kaW5nIHJlZmVyZW5jZSBhbmNob3JzIikKTU8uYW5jaG9ycyA8LSBGaW5kVHJhbnNmZXJBbmNob3JzKHJlZmVyZW5jZSA9IE1CTyAscXVlcnkgPSBNTy5xdWVyeSwgZGltcyA9IDE6MjUpCiMgY2FuIHRyeSBhIHJhbmdlIG9mIGRpbXMgMjAtNTAKcHJpbnQoImdldHRpbmcgcHJlZGljdGlvbnMiKQpwcmVkaWN0aW9ucyA8LSBUcmFuc2ZlckRhdGEoYW5jaG9yc2V0ID0gTU8uYW5jaG9ycywgcmVmZGF0YSA9IE1CTyRjbHVzdGVyX2xhYmVscykKTU8ucXVlcnkgPC0gQWRkTWV0YURhdGEoTU8ucXVlcnksIG1ldGFkYXRhID0gcHJlZGljdGlvbnMpCnByaW50KHRhYmxlKE1PLnF1ZXJ5JHByZWRpY3RlZC5pZCkpCgpzZXUucSA8LSBNTy5xdWVyeQoKc2V1LnEgPC0gRmluZENsdXN0ZXJzKHNldS5xLCByZXNvbHV0aW9uID0gYygxLjIpKQoKIyMgY2hlY2sgdGhlIHByb3BvcnRpb24gb2YgY2VsbCB0eXBlcyBwcmVkaWN0ZWQgaW4gZWFjaCBjbHVzdGVyCnQubGFibGVzIDwtIGFzLmRhdGEuZnJhbWUodGFibGUoc2V1LnEkUk5BX3Nubl9yZXMuMS4yLCBzZXUucSRwcmVkaWN0ZWQuaWQpKQpwci50LmxhYmxlcyA8LSBhcy5kYXRhLmZyYW1lKHByb3AudGFibGUodGFibGUoc2V1LnEkUk5BX3Nubl9yZXMuMS4yLCBzZXUucSRwcmVkaWN0ZWQuaWQpKSkKdC5sYWJsZXMkRnJlcSA8LSBhcy5kb3VibGUodC5sYWJsZXMkRnJlcSkKCgojIHRyeSBiYXIgY2hhcnQKZ2dwbG90KHQubGFibGVzLCBhZXMoeSA9IEZyZXEsIHggPSBWYXIxLCBmaWxsID0gVmFyMikpICsgZ2VvbV9iYXIocG9zaXRpb24gPSAic3RhY2siLCBzdGF0PSAiaWRlbnRpdHkiKQoKCgpgYGAKCgoKCgoKCgoKCgoKCk1lcmdlIHRoZSBmaWxlcwoKYGBge3J9CklkZW50cyhOZXVyb25zMWZ0KSA8LSAnb3JpZy5pZGVudCcKTmV1cm9uczFmdCRvcmlnLmlkZW50IDwtICdOZXVyb25zMScKSWRlbnRzKE5ldXJvbnMyZnQpIDwtICdvcmlnLmlkZW50JwpOZXVyb25zMmZ0JG9yaWcuaWRlbnQgPC0gJ05ldXJvbnMyJwpJZGVudHMoR2xpYTFmdCkgPC0gJ29yaWcuaWRlbnQnCkdsaWExZnQkb3JpZy5pZGVudCA8LSAnR2xpYTEnCklkZW50cyhHbGlhMmZ0KSA8LSAnb3JpZy5pZGVudCcKR2xpYTJmdCRvcmlnLmlkZW50IDwtICdHbGlhMicKCgpzb3J0ZWQubWVyZ2UgPC0gbWVyZ2UoTmV1cm9uczFmdCwgeT1jKE5ldXJvbnMyZnQsR2xpYTFmdCxHbGlhMmZ0KSwgYWRkLmNlbGwuaWRzID0gYygiTmV1cm9uczEiLCJOZXVyb25zMiIsIkdsaWExIiwiR2xpYTIiKSwgcHJvamVjdCA9ICJTb3J0ZWRDZWxscyIpCnNvcnRlZC5tZXJnZQoKc2F2ZVJEUyhzb3J0ZWQubWVyZ2UsICIvVXNlcnMvcmhhbGVuYXRob21hcy9Eb2N1bWVudHMvRGF0YS9zY1JOQXNlcS9QaGVub0lEL3NjUk5Bc2VxU29ydGVkL2NlbGxyYW5nZXJPdXRzL21lcmdlZE9iamVjdFNlcHQxOS5SZHMiKQoKc29ydGVkLm1lcmdlIDwtIHJlYWRSRFMoIi9Vc2Vycy9yaGFsZW5hdGhvbWFzL0RvY3VtZW50cy9EYXRhL3NjUk5Bc2VxL1BoZW5vSUQvc2NSTkFzZXFTb3J0ZWQvY2VsbHJhbmdlck91dHMvbWVyZ2VkT2JqZWN0U2VwdDE5LlJkcyIpCgoKYGBgCgoKCgpgYGB7cn0KCmFsbC5mdCA8LSBOb3JtYWxpemVEYXRhKGFsbC5mdCwgbm9ybWFsaXphdGlvbi5tZXRob2QgPSAiTG9nTm9ybWFsaXplIiwgc2NhbGUuZmFjdG9yID0gMTAwMDApCmFsbC5mdCA8LSBGaW5kVmFyaWFibGVGZWF0dXJlcyhhbGwuZnQsIHNlbGVjdGlvbi5tZXRob2QgPSAidnN0IiwgbmZlYXR1cmVzID0gMjAwMCkKIyBJZGVudGlmeSB0aGUgMTAgbW9zdCBoaWdobHkgdmFyaWFibGUgZ2VuZXMKdG9wMTAgPC0gaGVhZChWYXJpYWJsZUZlYXR1cmVzKGFsbC5mdCksIDEwKQojIHBsb3QgdmFyaWFibGUgZmVhdHVyZXMgd2l0aCBhbmQgd2l0aG91dCBsYWJlbHMKcGxvdDEgPC0gVmFyaWFibGVGZWF0dXJlUGxvdChhbGwuZnQpCnBsb3QyIDwtIExhYmVsUG9pbnRzKHBsb3QgPSBwbG90MSwgcG9pbnRzID0gdG9wMTAsIHJlcGVsID0gVFJVRSkKcGxvdDIKCmBgYAoKClByZXBhcmUgZm9yIHRoZSBjbHVzdGVyaW5nCgpgYGB7cn0KCmFsbC5mdCA8LSBTY2FsZURhdGEoYWxsLmZ0KQphbGwuZnQgPC0gUnVuUENBKGFsbC5mdCkKcGxvdCA8LSBWaXpEaW1Mb2FkaW5ncyhhbGwuZnQsIGRpbXMgPSAxOjIsIHJlZHVjdGlvbiA9ICJwY2EiKQojU2F2ZUZpZ3VyZShwbG90LCAidml6X1BDQV9sb2FkaW5ncyIsIHdpZHRoID0gMTAsIGhlaWdodCA9IDgpCnBsb3QKCgpgYGAKCmBgYHtyfQpwbG90IDwtIERpbVBsb3QoYWxsLmZ0LCByZWR1Y3Rpb24gPSAicGNhIiwgZ3JvdXAuYnkgPSAib3JpZy5pZGVudCIpCgpwbG90CmBgYAoKCmBgYHtyfQoKcGxvdCA8LSBFbGJvd1Bsb3QoYWxsLmZ0LG5kaW1zID0gNTApCnBsb3QKCiMgYmVzdCBpcyB0aGUgMjEKCmBgYAoKCmBgYHtyfQpWbG5QbG90KGFsbC5mdCwgZmVhdHVyZXMgPSBjKCJOQ0FNMSIsIkNENDQiLCJDRDI0IiwiQVFQNCIsIlRIIiksIG5jb2wgPSAzLCBncm91cC5ieSA9ICdvcmlnLmlkZW50JykKCmBgYAoKVGhlIGV4cHJlc3Npb24gb2YgdGhlIHNlbGVjdGVkIG1hcmtlcnMgYXJlIG5vdCB2ZXJ5IHJldmVhbGluZyAtIHRoZXJlIGFyZSBuZXVyb25hbCBtYXJrZXJzIGluIHRoZSBHbGlhCgoKSSB3aXNoIEkgaGFkIGRvbmUgYW4gdW5zb3J0ZWQgc2FtcGxlCgpOb3cgSSBoYXZlIGFsbCA0IHNhbXBsZXMgSSB3YW50IHRvIHRyeSB0aGUgaW50ZWdyYXRpb24gc3RlcHMKCgpgYGB7cn0KIyBJIGtlZXAgZ2V0dGluZyBhIG1lbW9yeSBlcnJvciBmb3IgaW50ZWdyYXRpb24uICBJJ2xsIHNhdmUgdGhlIHByb2Nlc3NlZCBmaWx0ZXJlZCBvYmplY3Qgbm93LiAgCgpzYXZlUkRTKGFsbC5mdCwgIi9Vc2Vycy9yaGFsZW5hdGhvbWFzL0RvY3VtZW50cy9EYXRhL3NjUk5Bc2VxL1BoZW5vSUQvc2NSTkFzZXFTb3J0ZWQvY2VsbHJhbmdlck91dHMvQWxsY2VsbHNPYmplY3RTZXB0MjBmaWx0ZXJlZC5SZHMiKQoKYWxsLmZ0IDwtIHJlYWRSRFMoIi9Vc2Vycy9yaGFsZW5hdGhvbWFzL0RvY3VtZW50cy9EYXRhL3NjUk5Bc2VxL1BoZW5vSUQvc2NSTkFzZXFTb3J0ZWQvY2VsbHJhbmdlck91dHMvQWxsY2VsbHNPYmplY3RTZXB0MjBmaWx0ZXJlZC5SZHMiKQoKCgpgYGAKCgoKCgpgYGB7cn0KCiMgaW50ZWdyYXRlIHRoZSBkYXRhc2V0cwphbGwubGlzdCA8LSBTcGxpdE9iamVjdChhbGwuZnQsIHNwbGl0LmJ5ID0gIm9yaWcuaWRlbnQiKQoKIyBTZXVyYXQgcmVjb21tZW5kcyBub3JtYWxpemluZyBhbmQgZmluZGluZyB2YXJpYWJsZSBmZWF0dXJlcyBiZWZvcmUgaW50ZWdyYXRpb24KZm9yIChpIGluIDE6bGVuZ3RoKGFsbC5saXN0KSl7CiAgYWxsLmxpc3RbW2ldXSA8LSBOb3JtYWxpemVEYXRhKGFsbC5saXN0W1tpXV0sIHZlcmJvc2UgPSBGQUxTRSkKICBhbGwubGlzdFtbaV1dIDwtIEZpbmRWYXJpYWJsZUZlYXR1cmVzKGFsbC5saXN0W1tpXV0sIHNlbGVjdGlvbi5tZXRob2QgPSAidnN0IikKfQoKIyBUaGlzIG9iamVjdCB3YXMgZG9uZSB3aXRoIHRoZSBub3JtYWxpemF0aW9uCmFsbC5hbmNob3JzIDwtIEZpbmRJbnRlZ3JhdGlvbkFuY2hvcnMob2JqZWN0Lmxpc3QgPSBhbGwubGlzdCwgcmVkdWN0aW9uID0gInJwY2EiLCBzY2FsZSA9IEZBTFNFKQoKCnNhdmVSRFMoYWxsLmludCwgIi9Vc2Vycy9yaGFsZW5hdGhvbWFzL0RvY3VtZW50cy9EYXRhL3NjUk5Bc2VxL1BoZW5vSUQvc2NSTkFzZXFTb3J0ZWQvY2VsbHJhbmdlck91dHMvbWVyZ2VkSW50T2JqZWN0U2VwdDE5LlJkcyIpCgoKc2F2ZVJEUyhhbGwuYW5jaG9ycywiL1VzZXJzL3JoYWxlbmF0aG9tYXMvRG9jdW1lbnRzL0RhdGEvc2NSTkFzZXEvUGhlbm9JRC9zY1JOQXNlcVNvcnRlZC9jZWxscmFuZ2VyT3V0cy9hbGxhbmNob3JzLlJkcyIpCgphbGwuYW5jaG9ycyA8LSByZWFkUkRTKCIvVXNlcnMvcmhhbGVuYXRob21hcy9Eb2N1bWVudHMvRGF0YS9zY1JOQXNlcS9QaGVub0lEL3NjUk5Bc2VxU29ydGVkL2NlbGxyYW5nZXJPdXRzL2FsbGFuY2hvcnMuUmRzIikKCmFsbC5pbnQgPC0gSW50ZWdyYXRlRGF0YShhbmNob3JzZXQgPSBhbGwuYW5jaG9ycykKCmBgYAoKCk5vdyB0aGF0IEkgaGF2ZSB0aGUgaW50ZWdyYXRlZCBvYmplY3QgSSB3aWxsIGNvbnRpbnVlIHRvIGZvbGxvdyB0aGUgc3RhbmRhcmQgc2NSTkFzZXEgdG8gd29ya2Zsb3cgYW5kIGlkZW50aWZ5IGNlbGwgdHlwZXMuIAoKCmBgYHtyfQoKIyB0aGUgZmlyc3Qgb2JqZWN0IC0gbm8gbm9ybWFsaXphdGlvbiBiZWZvcmUgaW50ZWdyYXRpb24KRGVmYXVsdEFzc2F5KGFsbC5pbnQpIDw9ICJpbnRlZ3JhdGVkIgphbGwuaW50IDwtIFNjYWxlRGF0YShhbGwuaW50LHZlcmJvc2UgPSBGQUxTRSkKYWxsLmludCA8LSBSdW5QQ0EoYWxsLmludCwgbnBjcyA9IDMwLCB2ZXJib3NlID0gRkFMU0UpCgpFbGJvd1Bsb3QoYWxsLmludCxuZGltcyA9IDMwKQoKYWxsLmludCA8LSBSdW5VTUFQKGFsbC5pbnQsIHJlZHVjdGlvbiA9ICJwY2EiLCBuLm5laWdoYm9ycyA9IDI3NSwgZGltcyA9IDE6MzApCkRpbVBsb3QoYWxsLmludCwgcmVkdWN0aW9uID0gInVtYXAiLCBncm91cC5ieSA9ICJvcmlnLmlkZW50IikKCgpgYGAKCgoKQ2x1c3RlciAKCmBgYHtyfQoKYWxsLmludCA8LSBGaW5kTmVpZ2hib3JzKGFsbC5pbnQsIGRpbXMgPSAxOjMwLCBrLnBhcmFtID0gMjc1KQphbGwuaW50IDwtIEZpbmRDbHVzdGVycyhhbGwuaW50LCByZXNvbHV0aW9uID0gYygwLDAuMDUsMC4yNSwwLjUsMC44KSkKY2x1c3RyZWUoYWxsLmludCwgcHJlZml4ID0gIlJOQV9zbm5fcmVzLiIpCgoKYGBgCgoKClRyeSBvbiB0aGUgbm90IGludGVncmF0ZWQgb2JqZWN0IC0ganVzdCBtZXJnZQoKYGBge3J9CgoKCmFsbC5mdCA8LSBTY2FsZURhdGEoYWxsLmZ0LCB2ZXJib3NlID0gRkFMU0UpCmFsbC5mdCA8LSBSdW5QQ0EoYWxsLmZ0LCBucGNzID0gMzAsIHZlcmJvc2UgPSBGQUxTRSkKCkVsYm93UGxvdChhbGwuZnQsbmRpbXMgPSAzMCkKCmFsbC5mdCA8LSBSdW5VTUFQKGFsbC5mdCwgcmVkdWN0aW9uID0gInBjYSIsIG4ubmVpZ2hib3JzID0gMzAsIGRpbXMgPSAxOjIxKQpEaW1QbG90KGFsbC5mdCwgcmVkdWN0aW9uID0gInVtYXAiLCBncm91cC5ieSA9ICJvcmlnLmlkZW50IikKCmBgYAoKCkZpbmQgdGhlIGNsdXN0ZXJzCgpgYGB7cn0KCmFsbC5mdCA8LSBGaW5kTmVpZ2hib3JzKGFsbC5mdCwgZGltcyA9IDE6MjEsIGsucGFyYW0gPSAzMCkKYWxsLmZ0IDwtIEZpbmRDbHVzdGVycyhhbGwuZnQsIHJlc29sdXRpb24gPSAwLjMpCiNjbHVzdHJlZShhbGwuaW50LCBwcmVmaXggPSAiUk5BX3Nubl9yZXMuIikKRGltUGxvdChhbGwuZnQsIHJlZHVjdGlvbiA9ICJ1bWFwIikKCgpgYGAKCgoKClRyYW5zZmVyIGxhYmVscyBmcm9tIG90aGVyIE1pZGJyYWluIG9yZ2Fub2lkIGRhdGEgKDE2NSBkYXlzKQoKCmBgYHtyfQojIHRoaXMgaXMgc29tZSByZWZlcmVuY2UgZGF0YQoKIyBTTkNBIG1pZGJyYWluIG9yZ2Fub2lkcwpNQk8gPC0gcmVhZFJEUygiL1VzZXJzL3JoYWxlbmF0aG9tYXMvRG9jdW1lbnRzL0RhdGEvc2NSTkFzZXEvQVNUMjNfQnJhaW5Db21tL01CT2NsdXN0ZXJzX25hbWVzMjkwNzIwMjEucmRzIikKIwojIERBIG5ldXJvbiBzdWJ0eXBlcyBmcm9tIHBvc3Rtb3J0ZW0gYnJhaW4gS2FtYXRoIGV0IGFsIDIwMjIKREFzdWJ0eXBlcyA8LSByZWFkUkRTKCIvVXNlcnMvcmhhbGVuYXRob21hcy9Eb2N1bWVudHMvRGF0YS9zY1JOQXNlcS9NYWNvc2tvX0RhdGEiKQoKSWRlbnRzKE1CTykgPC0gImNsdXN0ZXJfbGFiZWxzIgpEZWZhdWx0QXNzYXkoTUJPKSA8LSAiUk5BIgoKCk1PLnF1ZXJ5IDwtCiMgZmluZCB0aGUgcmVmZXJlbmNlIGFuY2hvcnMKcHJpbnQoImZpbmRpbmcgcmVmZXJlbmNlIGFuY2hvcnMiKQpNTy5hbmNob3JzIDwtIEZpbmRUcmFuc2ZlckFuY2hvcnMocmVmZXJlbmNlID0gTUJPICxxdWVyeSA9IE1PLnF1ZXJ5LCBkaW1zID0gMTozMCkKIyBjYW4gdHJ5IGEgcmFuZ2Ugb2YgZGltcyAyMC01MApwcmludCgiZ2V0dGluZyBwcmVkaWN0aW9ucyIpCnByZWRpY3Rpb25zIDwtIFRyYW5zZmVyRGF0YShhbmNob3JzZXQgPSBNTy5hbmNob3JzLCByZWZkYXRhID0gTUJPJGNsdXN0ZXJfbGFiZWxzKQpNTy5xdWVyeSA8LSBBZGRNZXRhRGF0YShNTy5xdWVyeSwgbWV0YWRhdGEgPSBwcmVkaWN0aW9ucykKCgpwcmludCh0YWJsZShNTy5xdWVyeSRwcmVkaWN0ZWQuaWQpKQoKCgoKYGBgCgoKU2VlIHRoZSBwcmVkaWN0aW9ucwoKCmBgYHtyfQoKRGltUGxvdChNTy5xdWVyeSwgcmVkdWN0aW9uID0gInVtYXAiLCBncm91cC5ieSA9ICdwcmVkaWN0ZWQuaWQnKQoKCmBgYAoKU29tZSBoZWF0bWFwcwoKU2VlIHRoZSB1c3VhbCBtYXJrZXIgbGlzdHMgLSBieSBzb3J0ZWQgcG9wdWxhdGlvbiwgYnkgY2x1c3RlcnMKCmBgYHtyfQoKCgpJZGVudHMoYWxsLmZ0KSA8LSAnb3JpZy5pZGVudCcKQ2x1c3Rlck1hcmtlcnMgPC0gRmluZEFsbE1hcmtlcnMoYWxsLmZ0KQoKdG9wNSA8LSBDbHVzdGVyTWFya2VycyAlPiUgZ3JvdXBfYnkoY2x1c3RlcikgJT4lIHRvcF9uKG49NSwgd3QgPSBhdmdfbG9nMkZDKQpEb0hlYXRtYXAoYWxsLmZ0LCBmZWF0dXJlcyA9IHRvcDUkZ2VuZSwgc2l6ZT0zLCBhbmdsZSA9OTAsIGdyb3VwLmJhci5oZWlnaHQgPSAwLjAyLCBncm91cC5ieSA9ICdvcmlnLmlkZW50JykKCgp3cml0ZS5jc3YoQ2x1c3Rlck1hcmtlcnMsICIvVXNlcnMvcmhhbGVuYXRob21hcy9Eb2N1bWVudHMvRGF0YS9zY1JOQXNlcS9QaGVub0lEL3NjUk5Bc2VxU29ydGVkL2NlbGxyYW5nZXJPdXRzL0NsdXN0ZXJNYXJrZXJzXzRzYW1wbGVzX0ZpbmRBbGwuY3N2IikKCiMgRmluZCBtYXJrZXJzIEdsaWEgdnMgTmV1cm9ucwoKTWFya2Vycy5nbGlhVm5ldXJvbiA8LSBGaW5kTWFya2VycyhhbGwuZnQsIGlkZW50LjEgPSBjKCdHbGlhMScsJ0dsaWEyJyksIGlkZW50LjIgPSBjKCdOZXVyb25zMScsJ05ldXJvbnMyJykpCnRvcDUuZ24gPC0gTWFya2Vycy5nbGlhVm5ldXJvbiAlPiUgdG9wX24obj0tNSwgd3QgPSBhdmdfbG9nMkZDKQp3cml0ZS5jc3YoQ2x1c3Rlck1hcmtlcnMsICIvVXNlcnMvcmhhbGVuYXRob21hcy9Eb2N1bWVudHMvRGF0YS9zY1JOQXNlcS9QaGVub0lEL3NjUk5Bc2VxU29ydGVkL2NlbGxyYW5nZXJPdXRzL0NsdXN0ZXJNYXJrZXJzX0dsaWFWc05ldXJvbnMuY3N2IikKCiMgQ29tcGFyZSBHbGlhMSB2cyBHbGlhMgpNYXJrZXJzLmdsaWExVnMyIDwtIEZpbmRNYXJrZXJzKGFsbC5mdCwgaWRlbnQuMSA9IGMoJ0dsaWExJyksIGlkZW50LjIgPSBjKCdHbGlhMicpKQp3cml0ZS5jc3YoQ2x1c3Rlck1hcmtlcnMsICIvVXNlcnMvcmhhbGVuYXRob21hcy9Eb2N1bWVudHMvRGF0YS9zY1JOQXNlcS9QaGVub0lEL3NjUk5Bc2VxU29ydGVkL2NlbGxyYW5nZXJPdXRzL0NsdXN0ZXJNYXJrZXJzX0dsaWExc0dsaWEyLmNzdiIpCgojIENvbXBhcmUgTmV1cm9uczEgdnMgTmV1cm9uczIKTWFya2Vycy5uZXVyb25zMXZzMiA8LSBGaW5kTWFya2VycyhhbGwuZnQsIGlkZW50LjEgPSBjKCdOZXVyb25zMScpLCBpZGVudC4yID0gYygnTmV1cm9uczInKSkKd3JpdGUuY3N2KENsdXN0ZXJNYXJrZXJzLCAiL1VzZXJzL3JoYWxlbmF0aG9tYXMvRG9jdW1lbnRzL0RhdGEvc2NSTkFzZXEvUGhlbm9JRC9zY1JOQXNlcVNvcnRlZC9jZWxscmFuZ2VyT3V0cy9DbHVzdGVyTWFya2Vyc19OZXVyb25zMVZzTmV1cm9uczIuY3N2IikKCmBgYAoKQ2hlY2sgY2VsbCB0eXBlcyB1c2luZyBFbnJpY2hSCgpgYGB7cn0KCmxpYnJhcnkoZGV2dG9vbHMpCmluc3RhbGxfZ2l0aHViKCJ3amF3YWlkL2VucmljaFIiKQpsaWJyYXJ5KGVucmljaFIpCgoKc2V0RW5yaWNoclNpdGUoIkVucmljaHIiKSAjIEh1bWFuIGdlbmVzCiMgbGlzdCBvZiBhbGwgdGhlIGRhdGFiYXNlcwoKZGJzIDwtIGxpc3RFbnJpY2hyRGJzKCkKZGJzCiMgbGliYXJpZXMgd2l0aCBjZWxsIHR5cGVzCgpkYiA8LSBjKCdBbGxlbl9CcmFpbl9BdGxhc18xMHhfc2NSTkFfMjAyMScsICdEZXNjYXJ0ZXNfQ2VsbF9UeXBlc19hbmRfVGlzc3VlXzIwMjEnLAogICAgICAgICdDZWxsTWFya2VyX0F1Z21lbnRlZF8yMDIxJywnQXppbXV0aF9DZWxsX1R5cGVzXzIwMjEnKQoKIyBlbnJpY2hyKGdlbmVzLCBkYXRhYmFzZXMgPSBOVUxMKQoKZ2VuZXMudXAubmV1ciA8LSBDbHVzdGVyTWFya2VycyAlPiUgZmlsdGVyKGNsdXN0ZXIgPT0gJ05ldXJvbnMxJyAmIGF2Z19sb2cyRkMgPiAwKQpnZW5lcyA8LSBnZW5lcy51cC5uZXVyJGdlbmUKCm5ldXJvbnMuRW4gPC0gZW5yaWNocihnZW5lcywgZGF0YWJhc2VzID0gZGIpCgpwbG90RW5yaWNoKG5ldXJvbnMuRW5bWzJdXSwgc2hvd1Rlcm1zID0gMjAsIG51bUNoYXIgPSA0MCwgeSA9ICJDb3VudCIsIG9yZGVyQnkgPSAiUC52YWx1ZSIpCnBsb3RFbnJpY2gobmV1cm9ucy5FbltbM11dLCBzaG93VGVybXMgPSAyMCwgbnVtQ2hhciA9IDQwLCB5ID0gIkNvdW50Iiwgb3JkZXJCeSA9ICJQLnZhbHVlIikKcGxvdEVucmljaChuZXVyb25zLkVuW1s0XV0sIHNob3dUZXJtcyA9IDIwLCBudW1DaGFyID0gNDAsIHkgPSAiQ291bnQiLCBvcmRlckJ5ID0gIlAudmFsdWUiKQoKbmV1cm9ucy5FbltbM11dCgoKCmBgYAoKCg==